package ws.very.util.segWord

import org.lionsoul.jcseg.core.JcsegTaskConfig
import org.lionsoul.jcseg.core.DictionaryFactory
import org.lionsoul.jcseg.core.SegmentFactory
import org.lionsoul.jcseg.core.IWord
import java.io.StringReader
import java.util.LinkedList
import java.io.File
import jtextpro.JTextPro
import vn.hus.nlp.tokenizer.VietTokenizer
import ws.very.util.lang.Implicits2

object TestSegmentWord extends App with Implicits2{
  lazy val testChinese = new {
    val config = new JcsegTaskConfig()

    val dic = DictionaryFactory.createDefaultDictionary(config)
    val seg = SegmentFactory.createJcseg(JcsegTaskConfig.SIMPLE_MODE, config, dic)

    println("jcseg参数设置：")
    println("最大切分匹配词数：" + config.MAX_LENGTH)
    println("最大混合中文长度：" + config.MIX_CN_LENGTH)
    println("开启中文人名识别：" + config.I_CN_NAME)
    println("最大姓氏前缀修饰：" + config.MAX_CN_LNADRON)
    println("最大标点配对词长：" + config.PPT_MAX_LENGTH)
    println("词库词条拼音加载：" + config.LOAD_CJK_PINYIN)
    println("分词词条拼音追加：" + config.APPEND_CJK_PINYIN)
    println("词库同义词的载入：" + config.LOAD_CJK_SYN)
    println("分词同义词的追加：" + config.APPEND_CJK_SYN)
    println("词库词条词性载入：" + config.LOAD_CJK_POS)
    println("去除切分后噪音词：" + config.CLEAR_STOPWORD)
    println("中文数字转阿拉伯：" + config.CNNUM_TO_ARABIC)
    println("中文分数转阿拉伯：" + config.CNFRA_TO_ARABIC)
    println("保留未识别的字符：" + config.KEEP_UNREG_WORDS)
    println("英文词条二次切分：" + config.EN_SECOND_SEG)
    println("姓名成词歧义阕值：" + config.NAME_SINGLE_THRESHOLD + "\n")

    def segment(str: String) = {
      val sb = new StringBuffer()
      var word: IWord = null
      val _start = System.nanoTime()
      var isFirst = true
      var counter = 0
      seg.reset(new StringReader(str))

      while ({ word = seg.next(); word } != null) {
        if (isFirst) {
          sb.append(word.getValue)
          isFirst = false
        } else {
          sb.append(" ")
          sb.append(word.getValue)
        }
        if (word.getPartSpeech != null) {
          sb.append('/')
          sb.append(word.getPartSpeech()(0))
        }
        word = null
        counter += 1
      }

      val e = System.nanoTime()
      println("分词结果：")
      println(sb.toString)
      println(format("Done, total:" + seg.getStreamPosition + ", split:" + +counter + ", cost: %.5fsec(less than)\n", (e.toFloat - _start) / 1E9))
    }

    def result(s: S) = {
      val l = new LinkedList[S]
      seg.reset(new StringReader(s))
      var word: IWord = null
      while ({ word = seg.next(); word } != null) {
        l.add(word.getValue)
      }
      l
    }
    def test(s: S) = println(result(s).mkString("\t"))

  }

  lazy val testYueNan = new {

    val modelDir = """E:\kuaipan\libs\JTextPro\models"""
    val senSegmentationModelDir = modelDir + File.separator + "SenSegmenter"
    val posTaggingModelDir = modelDir + File.separator + "CRFTagger"
    val phraseChunkingModelDir = modelDir + File.separator + "CRFChunker"

    val textPro = new JTextPro()
    textPro.setSenSegmenterModelDir(senSegmentationModelDir)
    println()
    println("Loading sentence segmentation model ...")
    textPro.initSenSegmenter()
    println("Loading sentence segmentation model completed!")
    textPro.initSenTokenizer()
    textPro.setPosTaggerModelDir(posTaggingModelDir)
    println()
    println("Loading POS tagging model ...")
    textPro.initPosTagger()
    println("Loading POS tagging model completed!")
    textPro.setPhraseChunkerModelDir(phraseChunkingModelDir)
    println()
    println("Loading phrase chunking model ...")
    textPro.initPhraseChunker()
    println("Loading phrase chunking model completed!")
    println()
    def test(txt: S) = {

      val sentences = textPro.doSenSegmentation(txt).map { _.toString }
      sentences.foreach { sentence =>
        val senToks = JTextPro.tokenize(textPro.doSenTokenization(sentence))
        val posTags = textPro.doPosTagging(senToks)
        val chunkTags = textPro.doPhraseChunking(senToks, posTags)
        println("senToks=\t" + senToks.mkString("\t"))
        println("posTags=\t" + posTags.mkString("\t"))
        println("chunkTags=\t" + chunkTags.mkString("\t"))
      }
      3 times println("*" * 300)
    }
  }

  lazy val yueNan2 = new {
    //println("filePath:"+"".getAbsolutePath())
    val vietTokenizer = new VietTokenizer()
    def r(s: S) = {
      s.split("\r\n").map { s => //sys.props("line.separator")  var s = """abcde
        //        fg""".stripMargin.replaceAll("[\n\r]","")
        vietTokenizer.segment(s).split(" ").map { _.replaceAll("_", " ") }
      }

    }
    def test(s: S) =
      println(r(s).map { _.mkString("\r\n") }.mkString("\r\n"))
  }

  val txts = Array("""
  Abstract of the paper : 
		  In domains like patents and biomedical information retrieval
a set of keywords as a query may not be sufficient but a document as a
query could be more useful. Entire content of the document as a query
will not be feasible as the results might be noisy and irrelevant. An
optimal query can be formed by extracting important keywords from
the document. We propose an unsupervised approach to extract and
rank candidate key phrases from a document. The goal is to maximize a
retrieval score like MAP or Recall depending upon the nature of search
task. A learning to rank method is used to select top phrases represented
by a set of pre-retrieval features used for query performance prediction.
The proposed keyphrase extraction technique is used to construct queries
from patents for Invalidity Search task in patent retrieval. Experiments
on a collection of USPTO Patents to maximize Recall and MAP show
that our approach is comparable to the baseline methods.    
  """, //

    """Trừu tượng của giấy:

Trong các lĩnh vực như bằng sáng chế và y sinh học thông tin retrieval
một tập hợp các từ khóa như một truy vấn có thể không được đầy đủ nhưng một tài liệu như là một
truy vấn có thể là hữu ích hơn. Toàn bộ nội dung của các tài liệu như một truy vấn
sẽ không được khả thi vì các kết quả có thể được ồn ào và không liên quan. Một
tối ưu truy vấn có thể được hình thành bằng cách chiết các từ khóa quan trọng từ
Các tài liệu. Chúng tôi đề xuất một cách tiếp cận không có giám sát để trích xuất và
Xếp hạng ứng cử viên các cụm từ khóa từ tài liệu một. Mục đích là để tối đa hóa một
tra cứu điểm thích bản đồ hoặc thu hồi tùy thuộc vào bản chất của tìm kiếm
nhiệm vụ. Learning để xếp hạng phương pháp được sử dụng để chọn hàng đầu cụm từ đại diện
bởi một tập hợp trước retrieval tính năng được sử dụng để dự đoán hiệu suất truy vấn.
Kỹ thuật khai thác đề xuất keyphrase được sử dụng để xây dựng truy vấn
từ bằng sáng chế cho vô hiệu tìm công việc trong bằng sáng chế truy. Thí nghiệm
trên một tập hợp các USPTO bằng sáng chế để tối đa hóa thu hồi và bản đồ hiển thị
rằng cách tiếp cận của chúng tôi được so sánh với các phương pháp đường cơ sở.
  """, """
  文件摘要:

像专利和生物医学信息检索域中
一组关键字作为查询可能不足够但作为文档
查询可能更有用。整个文档的内容作为查询
将不是可行的结果可能是嘈杂和不相关。一个
可以通过提取重要的关键字从形成优化查询
该文档。我们建议提取无监督的方法和
排名的候选人从文档的关键短语。目标是最大化
检索积分喜欢地图或召回取决于搜索的性质
任务。学习对排名方法用于选择顶部短语表示
由一组用于查询性能预测预检索功能。
拟议的关键词选择萃取技术用来构造查询
从专利的专利检索中的无效搜索任务。实验
在集合的 USPTO 专利，以最大限度地回收和地图上显示
我们的做法是基线方法相媲美。    
  """,
    "歧义和同义词:研究生命起源，" +
      "混合词: 做B超检查身体，x射线本质是什么，今天去奇都ktv唱卡拉ok去，哆啦a梦是一个动漫中的主角，" +
      "单位和全角: 2009年８月６日开始大学之旅，岳阳今天的气温为38.6℃, 也就是101.48℉, " +
      "中文数字/分数: 你分三十分之二, 小陈拿三十分之五,剩下的三十分之二十三全部是我的，那是一九九八年前的事了，四川麻辣烫很好吃，五四运动留下的五四精神。笔记本五折包邮亏本大甩卖。" +
      "人名识别: 我是陈鑫，也是jcesg的作者，三国时期的诸葛亮是个天才，我们一起给刘翔加油，" +
      "罗志高兴奋极了因为老吴送了他一台笔记本。" +
      "配对标点: 本次『畅想杯』黑客技术大赛的得主为电信09-2BF的张三，奖励C++程序设计语言一书和【畅想网络】的『PHP教程』一套。" +
      "特殊字母: 【Ⅰ】（Ⅱ），" +
      "英文数字: bug report chenxin619315@gmail.com or visit http://code.google.com/p/jcseg, we all admire the hacker spirit!" +
      "特殊数字: ① ⑩ ⑽ ㈩.", """(同人CG集)[111229][しあし屋] しすたーふぁっかー! + アヘ顔×イキ顔×ロボ娘! + おうじょさんVSすらいむ + ドラゴン○エストIV HCG集 (4CG)""")
  //    testYueNan
  //  testChinese
  txts.foreach { s =>
    try {
      println("原文" + "*" * 300)
      println(s)
      println("分词" + "-" * 300)
      testChinese.test(s)

    } catch {
      case e =>
        println(s)
        e.printStackTrace()
    }
  }
  
}